有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring:如何以编程方式在BeanDefinition的list属性中填充bean引用列表?

在Spring应用程序上下文的XML配置中,我可以用对适当bean的引用填充bean定义上的列表属性,例如:

<bean id="company" class="SimpleTestProject.beans.jobs.Company">
  <property name="workers">
    <list>
      <ref bean="worker1"/>
      <ref bean="worker2"/>
      <ref bean="worker3"/>
    </list>
  </property>
</bean>

现在我想做的是,以编程方式填充这样一个属性。假设我的BeanFactoryBeanFactoryPostProcessor处理。在postProcessBeanFactory()方法中,我找到了我的公司BeanDefinition,它有一个list属性。然后,我通过调用beanFactory.registerSingleton(...)来在这个BeanFactory上注册一个类型为Worker的单例bean列表。现在,我如何将对这些新的BeanDefinition的引用填充到companybean的列表中?我见过,有一种方法像

beanFactory.getBeanDefinition("beanName").getPropertyValues().setPropertyValueAt(...)

这显然设置了一个Bean属性。但是我怎样才能传递一个引用列表呢?有办法做到这一点吗


共 (1) 个答案

  1. # 1 楼答案

    一旦将单例Bean注册到BeanFactory,就可以将其自动连接到任何Bean,如下所示

    @Autowired
    List<Worker> workers;
    

    Spring容器将自动为您提供与此列表引用匹配类型的bean列表

    reference

    With byType or constructor autowiring mode, you can wire arrays and typed collections. In such cases, all autowire candidates within the container that match the expected type are provided to satisfy the dependency

    如果您试图避免@Autowired注释,那么从BeanFactoryPostProcessor开始也可以。假设您已经将以下字段添加到名为company的bean中

    List<Worker> workers;
    

    在BeanFactory后处理器中

    List<Object> workers = new ArrayList<Object>();
    workers.add(beanFactory.getBean("worker1"));
    workers.add(beanFactory.getBean("worker2"));
    
    beanFactory.getBeanDefinition("company").getPropertyValues().addPropertyValue("workers",workers);